/**
 * 使用JSON.parse(JSON.stringify());进行深拷贝的缺点
 * 1、对于 function、undefined、Symbol,这个键值对会消失
 * 2、对于 RegExp,会转为一个空对象
 * 3、对于 NaN、Infinity(-Infinity),会转为null
 * 4、对于 Date 对象，会转为字符串
 * 5、无法拷贝对象的循环引用(例如: obj[key] = obj,会报错)
 * 6、会抛弃对象的 constructor 属性,所有的构造函数会指向 Object
 * 7、无法拷贝对象的原型链
 * 8、无法拷贝对象的不可枚举属性
 */

export const deepClone = data => {
  let cache = new Map(); // 循环引用可以使用缓存的方式，现在这种不完善
  function _deepClone(data) {
    if (cache.has(data)) return cache.get(data);
    if (data === null || typeof data !== 'object') return data;
    const result = Array.isArray(data) ? [] : {};
    cache.set(data, result);
    for (const key in data) {
      result[key] = _deepClone(data[key]);
    }
    return result;
  }
  return _deepClone(data);
};
